#include <iostream>
#include <unistd.h>
using namespace std;
template<class T>
class Auto_ptr
{
public:
    //RAII
    Auto_ptr(T* ptr = nullptr)
        :_ptr(ptr)
    {}
    ~Auto_ptr()
    {
        if (_ptr != nullptr)
        {
            //cout << "delete: " << _ptr << endl;
            delete _ptr;
            _ptr = nullptr;
        }
        else return;
    }
    Auto_ptr(Auto_ptr<T>& ap)
        :_ptr(ap._ptr)
    {
        ap._ptr = nullptr; //管理权转移后ap被置空
    }
    Auto_ptr& operator=(Auto_ptr<T>& ap)
    {
        if (this != &ap)
        {
            delete _ptr;       //释放自己管理的资源
            _ptr = ap._ptr;    //接管ap对象的资源
            ap._ptr = nullptr; //管理权转移后ap被置空
        }
        return *this;
    }
    //可以像指针一样使用
    T& operator*()
    {
        return *_ptr;
    }
    T* operator->()
    {
        return _ptr;
    }
private:
    T* _ptr; //管理的资源
};


void test()
{
    Auto_ptr<int> x(new int(1));
	Auto_ptr<int> y(new int(2));
	x = y;
	cout << *x << endl;
    // int i = 10;
    // while(i--)
    // {
    //     sleep(1);
    //     printf("hello word\n");
    // }
}